package com.linko.intelligent.remote.core.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.linko.intelligent.common.util.HttpUtil;
import com.linko.intelligent.remote.core.mapper.IotLatLngMapper;
import com.linko.intelligent.remote.core.mapper.IotStatusMapper;
import com.linko.intelligent.remote.core.service.IotRefreshService;
import com.linko.intelligent.remote.pojo.dto.IocoDto;
import com.linko.intelligent.remote.pojo.po.IotLatLng;
import com.linko.intelligent.remote.pojo.po.IotStatus;
import okhttp3.Response;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class IotRefreshServiceImpl implements IotRefreshService {
    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(HttpUtil.class);
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Value("${url.dj92}")
    private String apiUrl;
    @Autowired
    private IotLatLngMapper iotLatLngMapper;
    @Autowired
    private IotStatusMapper iotStatusMapper;

    public void refresh() {
        // 查询最新的经纬度和状态数据
        List<IotLatLng> lastLatLng = iotLatLngMapper.selectLast();
        List<IotStatus> lastStatus = iotStatusMapper.selectLast();

        // 获取请求体
        JSONObject requestBody = buildRequestBody(lastLatLng, lastStatus);

        // 发送 POST 请求并获取响应
        Response response = HttpUtil.post(apiUrl + "/data/provide/DD34E18B10124850BAD38EA96ECD353C", requestBody);

        // 处理响应
        handleResponse(response);
    }

    private JSONObject buildRequestBody(List<IotLatLng> lastLatLng, List<IotStatus> lastStatus) {
        JSONObject requestBody = new JSONObject();
        requestBody.put("ps", "1000");
        requestBody.put("typeFlag", 3);
        requestBody.put("sortStr", "create_time asc");
//        requestBody.put("startTime", "2024-02-21 14:13:56");
//        requestBody.put("endTime", "2024-02-21 14:15:56");

        // 判断lastStatus和lastLatLng哪个时间靠后，取时间靠后的那个
        Date startTime = getLastTime(lastLatLng, lastStatus);
        if (startTime != null) {
            requestBody.put("startTime", sdf.format(startTime));
        }

        return requestBody;
    }

    private Date getLastTime(List<IotLatLng> lastLatLng, List<IotStatus> lastStatus) {
        Date lastLatLngTime = lastLatLng.isEmpty() ? null : lastLatLng.get(0).getCreateTime();
        Date lastStatusTime = lastStatus.isEmpty() ? null : lastStatus.get(0).getCreateTime();
        return (lastLatLngTime != null && lastStatusTime != null) ?
                (lastStatusTime.after(lastLatLngTime) ? lastStatusTime : lastLatLngTime) :
                (lastStatusTime != null ? lastStatusTime : lastLatLngTime);
    }

    private void handleResponse(Response response) {
        if (response != null && response.isSuccessful()) {
            try {
                String responseBody = response.body().string();
                JSONObject jsonResponse = JSONObject.parseObject(responseBody);
                JSONObject data = jsonResponse.getJSONObject("data");
                JSONArray listArray = data.getJSONArray("list");

                // 解析响应并处理数据
                List<IocoDto> iocoDtoList = parseAndProcessResponse(listArray);

                // 记录日志
                logger.info("成功解析并处理响应数据");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("请求失败");
        }
    }

    private List<IocoDto> parseAndProcessResponse(JSONArray listArray) {
        List<IocoDto> iocoDtoList = new ArrayList<>();
        for (int i = 0; i < listArray.size(); i++) {
            JSONObject jsonObject = listArray.getJSONObject(i);
            // 根据自定义逻辑将 JSON 对象转换为 IocoDto 对象
            IocoDto iocoDto = JSONObject.parseObject(jsonObject.toJSONString(), IocoDto.class);
            // 将转换后的对象添加到列表中
            iocoDtoList.add(iocoDto);
            // 处理解析后的数据，比如保存到数据库或者进行其他业务逻辑处理
            processIocoDto(iocoDto);
        }
        return iocoDtoList;
    }

    private void processIocoDto(IocoDto iocoDto) {
        // 保存到经纬度表或状态表
        if (iocoDto.getLat() != null && iocoDto.getLng() != null) {
            IotLatLng po = new IotLatLng();
            BeanUtils.copyProperties(iocoDto, po);
            po.setIntCreateTime(new Date());
            iotLatLngMapper.insert(po);
        }
        if (iocoDto.getAcc() != null) {
            IotStatus po = new IotStatus();
            BeanUtils.copyProperties(iocoDto, po);
            po.setIntCreateTime(new Date());
            iotStatusMapper.insert(po);
        }
    }
}


